﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 百词斩
{

    public static class Class1
    {

        struct OneFile
        {
            public int s;
            public int e;
            public string fileName;
            public byte[] data;
        }
        public static void GetFileStruct(string fileName)
        {

            System.IO.FileStream sr = new System.IO.FileStream(fileName, System.IO.FileMode.Open);
            long 文件长度 = sr.Length;



            //文件的头部这俩位置，分别存储，所有文件头尾的数字，起始标记位置，和末尾的最后标记，包含文件名字
            int data = BitConverter.ToInt32(GetBytes(sr, 0x10, 0x13), 0);



            int 文件最后的那段开头标记 = BitConverter.ToInt32(GetBytes(sr, 0x18, 0x1b), 0);

            byte[] info = GetBytes(sr, 文件最后的那段开头标记, 文件长度);

            string[] fileNames
                = Encoding.UTF8.GetString(info).Split(new string[] { "\n","\0" }, StringSplitOptions.RemoveEmptyEntries);


            //这里错开0x10*3才是文件中内容的，第一段结束位置。第一段开始位置固定是0x80


            List<OneFile> fileList = new List<OneFile>();


            int _1文件头位置 = 0x80;


            for (int i = 0; i < fileNames.Length; i++)
            {
                OneFile one = new OneFile();
                one.s = _1文件头位置;
                one.fileName = fileNames[i];
                int I = i+1;
                int _2文件头位置 = data;
                if (fileNames.Length - 1 > i)
                {
                    _2文件头位置 = BitConverter.ToInt32(GetBytes(sr, data + 0x10 * 3 * I, data + 0x10 * 3 * I + 3), 0);
                }
                one.e = _2文件头位置;
                _1文件头位置 = _2文件头位置;
                
                var bytes = GetBytes(sr, one.s, one.e - 1);
                one.data = bytes;
                fileList.Add(one);
            }


        }

        private static byte[] GetBytes(FileStream sr, long 头部_含, long 尾部_含)
        {
            //以下是获取文件信息
            byte[] info = new byte[尾部_含 - 头部_含 + 1];
            sr.Seek(头部_含, System.IO.SeekOrigin.Begin);
            sr.Read(info, 0, info.Length);
            return info;
        }
    }
}
